package br.com.vti.sisp_sicrim.antigo.controller.tela;

import java.text.SimpleDateFormat;
import java.util.Calendar;

import br.com.caelum.vraptor.Result;
import br.com.vti.sisp_sicrim.antigo.controller.programa.FuncoesGerais;
import br.com.vti.sisp_sicrim.antigo.controller.programa.Scrp1000;
import br.com.vti.sisp_sicrim.antigo.model.SicCadastro;
import br.com.vti.sisp_sicrim.antigo.model.Sislac01;
import br.com.vti.sisp_sicrim.antigo.util.Sessao;
import br.com.vti.sisp_sicrim.antigo.util.UtilBean;

/**
 * Classe responsavel por encapsular o tratamento e as consistencias da tela Scrm1100
 * 
 * @author Incode - Data: mai/2014
 * 
 */
public class Scrm1100 {
	private boolean enviada = false;
	private String pagina = "/resources/antigo/jsp/Scrm1100.jsp";
	private String jVersaoj;
	private String dataCorrente;
	private String jFuncaoj;
	private String horaCorrente;
	private int jContadorj;
	private long jregGeral;
	private String jDisprg;
	private String jNomeCompleto;
	private String jMae;
	private String dnas;
	private String mnas;
	private String anas;
	private String sn;
	private String jPossuiMandatoPAberto;
	private String chave = "I";
	private String jEmpresaj = "";
	private String jProgramaj = "";
	private String[][] dedos = new String[6][3];
	private String mensagem = "";
	private String funcao = "0";
	private String campofocus = "jnomecompleto";
	private String navegar = "";
	public Boolean temMensagem = false;
	private Result result;
	private Sessao sessao;
	private FuncoesGerais funcoes = new FuncoesGerais();
	// Classes views
	SicCadastro criminalView = new SicCadastro();
	// Classes includes
	Sislac01 sislac01 = new Sislac01();

	public Scrm1100() {
		inicializar(false);
	}

	public Scrm1100(boolean primeiraVez, Sessao sessao) {
		this.sessao = sessao;
		inicializar(primeiraVez);
	}

	public void inicializar(boolean primeiraVez) {
		if (primeiraVez) {
			sn = "";
			jVersaoj = "";
			dataCorrente = "";
			jFuncaoj = "";
			jContadorj = 0;
			jregGeral = 0;
			jDisprg = "";
			jNomeCompleto = "";
			jMae = "";
			dnas = "";
			mnas = "";
			anas = "";
			jPossuiMandatoPAberto = "";
			chave = "I";
			dedos = (String[][]) UtilBean.fill(dedos, "");
			jEmpresaj = "";
			jProgramaj = "";
			jContadorj = sessao.getScrg001().getWContadorw();
			jEmpresaj = sessao.getScrg001().getWEmpresaw();
			jFuncaoj = sessao.getScrg001().getWFuncaow();
			jProgramaj = sessao.getScrg001().getWProgramaw();
			jVersaoj = sessao.getScrg001().getWVersaow();
		}
		dataCorrente = new SimpleDateFormat("dd/MM/yyyy").format(Calendar.getInstance().getTime()); // *DATE
		horaCorrente = new SimpleDateFormat("HH:mm:ss").format(Calendar.getInstance().getTime()); // *TIMX
	}

	public boolean receberTela(boolean primeiraVez, Result result) throws Exception {
		// faz o tratamento das criticas necessarias para os dados da tela
		// recebida
		this.result = result;
		temMensagem = false;
		if (!primeiraVez) {
			return validar();
		} else {
			return true;
		}
	}

	public void enviarTela(boolean primeiraVez, Result result, String origem) {
		this.enviada = true;
		// rotina para enviar a tela
		// caso esteja setado valores para acoesFinais, executa as classes
		// correspondentes
		this.result = result;
		if (UtilBean.acoesFinais != null && !UtilBean.acoesFinais.isEmpty()) {
			UtilBean.processaAcao();
		} else {
			enviar(result, origem);
		}
	}

	public void enviar(Result result, String origem) {
		// redicionar para o jsp correspondente
		UtilBean.redireciona(pagina, result, origem);
	}

	public void enviarMensagem(String campo, String mensagem) {
		// formatar a mensagem de erro, posicionar no campo informa
		if (campo != null) {
			campofocus = campo;
		} else {
			campofocus = "";
		}
		this.mensagem = mensagem;
		temMensagem = true;
		// enviar(result, origem);
	}

	public boolean validar() throws Exception {
		// validar os campos recebidos da tela
		UtilBean.funcao = this.funcao;
		ValidarFuncao();
		if (temMensagem) {
			return false;
		}
		ValidarWnomeCompleto();
		if (temMensagem) {
			return false;
		}
		ValidarWmae();
		if (temMensagem) {
			return false;
		}
		ValidarAnas();
		if (temMensagem) {
			return false;
		}
		ValidarWpossuiMandatoPAberto();
		if (temMensagem) {
			return false;
		}
		ValidarDedos();
		if (temMensagem) {
			return false;
		}
		ValidarD01dedos();
		if (temMensagem) {
			return false;
		}

		sessao.getScrg001().setWContadorw(this.jContadorj);
		sessao.getScrg001().setWEmpresaw(this.jEmpresaj);
		sessao.getScrg001().setWFuncaow(this.jFuncaoj);
		sessao.getScrg001().setWProgramaw(this.jProgramaj);
		sessao.getScrg001().setWVersaow(this.jVersaoj);
		return true;
	}

	private void ValidarFuncao() {
		// Consist�ncia F00funcao
		if (!(UtilBean.funcao.equals(UtilBean.ctt_processa) || UtilBean.funcao.equals(UtilBean.ctt_retorna))) {
			enviarMensagem(null, "");
			return;
		}
		if (UtilBean.funcao.equals(UtilBean.ctt_retorna)) {
			Scrp1000 scrp1000 = new Scrp1000(result, sessao);
			scrp1000.executar(null);
		}
	}

	private void ValidarWnomeCompleto() {
		// Consist�ncia F00#NOME-COMPLETO
		// DEFINE DATA LOCAL
		// 1 CRIMINAL-VIEW VIEW OF SIC-CADASTRO
		// 2 REGISTRO-ESTADUAL-GERAL
		// 2 NOME-COMPLETO
		// 2 NOME-MAE
		// 2 DATA-NASC
		// 2 POLDIR 2 INDDIR 2 MEDDIR 2 ANUDIR 2 MINDIR
		// 2 INDESQ 2 MEDESQ 2 ANUESQ 2 MINESQ 2 POLESQ
		// 1 DATA-D(D) 1 AL(N2) INIT <2>
		// 1 DATA-A(A8)
		// 1 REDEFINE DATA-A
		// 2 DATA-N(N8)
		// 2 REDEFINE DATA-N
		// 3 D(N2)
		// 3 M(N2)
		// 3 A(N4)
		// END-DEFINE
		if (chave.equals("I")) {
			if (jNomeCompleto.trim().equals("")) {
				enviarMensagem("jnomecompleto", "Campo de preenchimento obrigatorio");
				return;
			}
		}
	}

	// H1. FIND (1) CRIMINAL-VIEW WITH REGISTRO-ESTADUAL-GERAL = #REG_GERAL
	// MOVE NOME-COMPLETO TO #NOME-COMPLETO
	// MOVE NOME-MAE TO #MAE
	// MOVE DATA-NASC TO DATA-N
	// MOVE EDITED DATA-A TO DATA-D(EM=YYYYMMDD)
	// MOVE EDITED DATA-D(EM=DDMMYYYY) TO DATA-A
	// MOVE D TO DNAS
	// MOVE M TO MNAS
	// MOVE A TO ANAS
	// MOVE POLDIR TO DEDOS(1,1)
	// MOVE INDDIR TO DEDOS(2,1)
	// MOVE MEDDIR TO DEDOS(3,1)
	// MOVE ANUDIR TO DEDOS(4,1)
	// MOVE MINDIR TO DEDOS(5,1)
	// MOVE POLESQ TO DEDOS(1,2)
	// MOVE INDESQ TO DEDOS(2,2)
	// MOVE MEDESQ TO DEDOS(3,2)
	// MOVE ANUESQ TO DEDOS(4,2)
	// MOVE MINESQ TO DEDOS(5,2)
	// SET CONTROL "N" INPUT USING MAP "SCRM1100"
	// END-FIND
	// IF *COUNTER(H1.) = 0 && CHAVE = "A"
	// REINPUT "Registro Inexistente" ALARM
	// END-IF
	// PERFORM SCRSVNOM & AL
	private void ValidarWmae() {
		// Consist�ncia F00#MAE
		String jMae0;
		int wAlarm;
		int al = 3;
		jMae0 = jMae;
		if (chave.equals("I")) {
			wAlarm = 3;
			asteriscosMae();
		}
		if (chave.equals("A")) {
			wAlarm = 4;
			if (!jMae.trim().equals("")) {
				asteriscosMae();
			}
		}
	}

	private void asteriscosMae() {
		if (jMae.trim().equals("")) {
			enviarMensagem("jmae", "Se nao houver Nome da Mae, informe 1 asterisco");
			return;
		}
		if (UtilBean.subStr(jMae, 0, 1).equals("*"))
		// IF #MAE00 NE ""
		// REINPUT "Preencha somente com 12 asteriscos" MARK *& ALARM
		{
			if (!UtilBean.subStr(jMae, 1, 59).trim().equals(""))
			// END-IF
			{
				enviarMensagem("jmae", "Preencha somente com 1 asterisco");
				return;
			}
		} else {
			funcoes.scrsvnom("jmae", jMae);
			if (!funcoes.camret.equals("")) {
				enviarMensagem(funcoes.camret, funcoes.msgret);
				return;
			}
		}
	}

	private void ValidarAnas() throws Exception {
		// Consist�ncia F00ANAS
		Sislac01 sislac01 = new Sislac01();
		int dddd;
		int amnas;
		int dd;
		String mensa;
		int datn;
		int aa = 0;
		int fa;
		String senesp;
		String wDataNasc = "";
		int wIndex;
		String wChave = "";
		if (chave.equals("I")) {
			if (dnas.trim().equals("") && mnas.trim().equals("") && anas.trim().equals("")) {
				enviarMensagem("dnas", "Se nao tiver, preencha com zeros");
				return;
			}
			wDataNasc = UtilBean.moveSubstring(wDataNasc, 0, 2, "N", dnas);
			wDataNasc = UtilBean.moveSubstring(wDataNasc, 2, 2, "N", mnas);
			wDataNasc = UtilBean.moveSubstring(wDataNasc, 4, 4, "N", anas);

			for (wIndex = 1; wIndex <= 8; wIndex++) {
				if (UtilBean.subStr(wDataNasc, wIndex - 1, 1) != "0") {
					wChave = "Y";
				}
			}
			if (wChave.trim().equals("")) {
				if (!String.valueOf(wDataNasc).equals("00000000")) {
					enviarMensagem("dnas", "Se nao houver, informe zeros em toda a data");
					return;
				}
			} else {
				datn = UtilBean.obtemDataCorrente();
				dddd = Integer.parseInt(UtilBean.subStr(wDataNasc, 4, 4)) * 10000 + Integer.parseInt(UtilBean.subStr(wDataNasc, 2, 2)) * 100 + Integer.parseInt(UtilBean.subStr(wDataNasc, 0, 2));
				if (dddd > UtilBean.obtemDataCorrente()) {
					enviarMensagem("dnas", "Data de nascimento maior que a atual");
					return;
				}
				if (!UtilBean.validarMascara(dddd, "yyyyMMdd") || Integer.parseInt(UtilBean.subStr(wDataNasc, 4, 4)) < 1850 || Integer.parseInt(UtilBean.subStr(wDataNasc, 4, 4)) > UtilBean.subStr(datn, 0, 4)) {
					enviarMensagem("dnas", "Data invalida");
					return;
				}
			}
		}
	}

	// IF CHAVE = " " || CHAVE.equals("A"
	// FIND (1) CRIMINAL-VIEW WITH
	// NOME-COMPLETO = #NOME-COMPLETO &&
	// NOME-MAE = #MAE &&
	// DATA-NASC = DDDD
	// ACCEPT IF REGISTRO-ESTADUAL-GERAL NE #REG_GERAL
	// COMPRESS "HOMONIMOS CADASTRADOS, RG:"
	// REGISTRO-ESTADUAL-GERAL INTO MENSA
	// END-FIND
	// END-IF
	private void ValidarWpossuiMandatoPAberto() {
		// Consist�ncia F00#POSSUI-MANDATO-P-ABERTO
		if (jPossuiMandatoPAberto.equals("S") || jPossuiMandatoPAberto.equals("s") || jPossuiMandatoPAberto.equals("N") || jPossuiMandatoPAberto.equals("n")) {
			return;
		} else {
			enviarMensagem("jpossuimandatopaberto", "digite S ou N");
			return;
		}
	}

	private void ValidarDedos() throws Exception {
		// Consist�ncia F00DEDOS
		String dedo;
		int w = 0;
		int h = 0;
		int s = 0;
		int l = 0;
		int i = 0;
		int j = 0;
		String mensa = "";
		String senesp = "";
		String maodir = "";
		String maoesq = "";
		int k = 0;
		String wPassa = "";
		String wSN = "";
		String wMaeLimpa = "";
		String wTxt = "";
		// if (jContadorj == 0 && getDedos('*', '*').trim().equals("") && chave.equals("I")) {
		// // INPUT 396
		// if (!getEnviada()) {
		// enviarTela(false, result, getClass().getSimpleName().toUpperCase());
		// } else {
		// receberTela(false, result);
		// }
		// if (!((wSN.equals("S") || wSN.equals("N")))) {
		// enviarMensagem(null, "Informe �S� ou �N�");
		// return;
		// }
		// if (!((UtilBean.funcao.equals(UtilBean.ctt_retorna) || UtilBean.funcao.equals(UtilBean.ctt_processa)))) {
		// enviarMensagem(null, "Tecla invalda");
		// return;
		// }
		// if (UtilBean.funcao.equals(UtilBean.ctt_retorna)) {
		// Scrp1100 scrp1100 = new Scrp1100(result, sessao);
		// scrp1100.executar(null, null, null, null, null);
		// }
		// } else {
		// wSN = "S";
		// jContadorj = 2;
		// }
		wSN = sn;
		if (!jMae.equals("************")) {
			wMaeLimpa = jMae;
		} else {
			wMaeLimpa = "";
		}
		if (chave.equals("I")) {
			// Par�grafo: fd0()
			if (criminalView.consultaRegEstadualGeral(jregGeral)) {
				if (criminalView.getStatusReg() == 5)
				// || NOME-MAE = #MAE-LIMPA
				{
					wTxt = "   Ficha Criminal esta excluida  ";
				} else {
					wTxt = "Ficha ja Cadastrada Anteriormente";
				}
				// INPUT 427
				enviarMensagem(null, wTxt);
				return;
			}
		}
		if (wSN.equals("S") || jContadorj > 1) {
			jContadorj += 1;
			if (jContadorj == 1) {
				// INPUT 438
				enviarMensagem(null, "");
				return;
			}
			if (chave.equals("I") || chave.equals("A")) {
				funcoes.scrsfdat(dedos);
				if (!funcoes.camret.equals("")) {
					enviarMensagem(funcoes.camret, funcoes.msgret);
					return;
				}
				for (i = 1; i <= 2; i++) {
					for (j = 1; j <= 5; j++) {
						dedo = getDedos(j, i);
						if (!UtilBean.subStr(dedo, 4, 1).equals(" ") && !UtilBean.subStr(dedo, 1, 1).equals("4")) {
							k += 1;
						}
						if (UtilBean.subStr(dedo, 1, 1).equals("4") && UtilBean.subStr(dedo, 0, 1).equals(" ")) {
							w += 1;
						}
						if (!UtilBean.subStr(dedo, 0, 1).equals(" ")) {
							h += 1;
						}
						if (UtilBean.subStr(dedo, 0, 1).equals(" ") && UtilBean.subStr(dedo, 4, 1).equals(" ") && !UtilBean.subStr(dedo, 1, 1).equals(" ")) {
							l += 1;
						}
						if (UtilBean.subStr(dedo, 1, 1).equals("2") || UtilBean.subStr(dedo, 1, 1).equals("3") && j > 1 && UtilBean.subStr(dedo, 0, 1).equals(" ") && !UtilBean.subStr(dedo, 4, 1).equals(" ")) {
							s += 1;
						}
						if ((k > 2 && w == 0 && h < i) || s > 1) {
							enviarMensagem(null, "ERRO SUBCLASSIFICACAO POSICAO 5");
							return;
						}
					}
				}
				for (i = 1; i <= 5; i++) {
					maodir = UtilBean.moveSubstring(maodir, 7 * i, 7, "A", getDedos(i, 1));
					maoesq = UtilBean.moveSubstring(maoesq, 7 * i, 7, "A", getDedos(i, 2));
				}
				if (!UtilBean.funcao.equals(UtilBean.ctt_proxima)) {
					// Par�grafo: g()
					if (criminalView.consultaMaoDireitaMaoEsquerda(
					// maodir,
					getDedos(1, 1), getDedos(2, 1), getDedos(3, 1), getDedos(4, 1), getDedos(5, 1), getDedos(1, 2), getDedos(2, 2), getDedos(3, 2), getDedos(4, 2), getDedos(5, 2)
					// maoesq
					)) {
						if (criminalView.getNomeCompleto() != jNomeCompleto) {
							if (criminalView.totalRegistros() < 2) {
								setMensagemSaida(UtilBean.concatena("FORMULA DATILOSCOPICA C/RG:", criminalView.getRegEstadualGeral()));
							} else {
								setMensagemSaida(UtilBean.concatena("FORM.DATILOSC. COM ", criminalView.totalRegistros(), " OCORRENCIAS"));
							}
						}
					}
				}
			}
		} else {
			return;
		}
	}

	private void ValidarD01dedos() {
		// Consist�ncia D01DEDOS
	}

	public String getJversaoj() {
		return jVersaoj;
	}

	public void setJversaoj(String jVersaoj) {
		this.jVersaoj = jVersaoj;
	}

	public String getJnomeCompleto() {
		return jNomeCompleto;
	}

	public void setJnomeCompleto(String jNomeCompleto) {
		this.jNomeCompleto = jNomeCompleto;
	}

	public String getJpossuiMandatoPAberto() {
		return jPossuiMandatoPAberto;
	}

	public void setJpossuiMandatoPAberto(String jPossuiMandatoPAberto) {
		this.jPossuiMandatoPAberto = jPossuiMandatoPAberto;
	}

	public String getDataCorrente() {
		return dataCorrente;
	}

	public void setDataCorrente(String dataCorrente) {
		this.dataCorrente = dataCorrente;
	}

	public String getJfuncaoj() {
		return jFuncaoj;
	}

	public void setJfuncaoj(String jFuncaoj) {
		this.jFuncaoj = jFuncaoj;
	}

	public int getJcontadorj() {
		return jContadorj;
	}

	public void setJcontadorj(int jContadorj) {
		this.jContadorj = jContadorj;
	}

	public long getJregGeral() {
		return jregGeral;
	}

	public void setJregGeral(long jregGeral) {
		this.jregGeral = jregGeral;
	}

	public String getJdisprg() {
		return jDisprg;
	}

	public void setJdisprg(String jDisprg) {
		this.jDisprg = jDisprg;
	}

	public String getJnomecompleto() {
		return jNomeCompleto;
	}

	public void setJnomecompleto(String jNomeCompleto) {
		this.jNomeCompleto = jNomeCompleto;
	}

	public String getJmae() {
		return jMae;
	}

	public void setJmae(String jMae) {
		this.jMae = jMae;
	}

	public String getDataNasc() {
		return dnas + mnas + anas;
	}

	public String getDnas() {
		return dnas;
	}

	public void setDnas(String dnas) {
		this.dnas = dnas;
	}

	public String getMnas() {
		return mnas;
	}

	public void setMnas(String mnas) {
		this.mnas = mnas;
	}

	public String getAnas() {
		return anas;
	}

	public void setAnas(String anas) {
		this.anas = anas;
	}

	public String getJpossuimandatopaberto() {
		return jPossuiMandatoPAberto;
	}

	public void setJpossuimandatopaberto(String jPossuiMandatoPAberto) {
		this.jPossuiMandatoPAberto = jPossuiMandatoPAberto;
	}

	public String getChave() {
		return chave;
	}

	public void setChave(String chave) {
		this.chave = chave;
	}

	public String getJempresaj() {
		return jEmpresaj;
	}

	public void setJempresaj(String jEmpresaj) {
		this.jEmpresaj = jEmpresaj;
	}

	public String getJprogramaj() {
		return jProgramaj;
	}

	public void setJprogramaj(String jProgramaj) {
		this.jProgramaj = jProgramaj;
	}

	public String[][] getDedos() {
		return dedos;
	}

	public void setDedos(String[][] dedos) {
		this.dedos = dedos;
	}

	public String getDedos(int index1, int index2) {
		return dedos[index1][index2];
	}

	public String getDedos(char index1, char index2) {
		String retorno = "";
		loop: for (int i = 1; i < dedos.length; i++) {
			for (int j = 1; j < dedos[0].length; j++) {
				if (!dedos[i][j].trim().equals("")) {
					retorno = "valor";
					break loop;
				}
			}
		}

		return retorno;
	}

	public void setDedos(int index1, int index2, String dedos) {
		this.dedos[index1][index2] = dedos;
	}

	public String getHoraCorrente() {
		return horaCorrente;
	}

	public void setHoraCorrente(String horaCorrente) {
		this.horaCorrente = horaCorrente;
	}

	public String getFuncao() {
		return funcao;
	}

	public void setFuncao(String funcao) {
		this.funcao = funcao;
	}

	public String getCampofocus() {
		return campofocus;
	}

	public void setCampofocus(String campofocus) {
		this.campofocus = campofocus;
	}

	public String getNavegar() {
		return navegar;
	}

	public void setNavegar(String navegar) {
		this.navegar = navegar;
	}

	public String getMensagem() {
		return mensagem;
	}

	public void setMensagem(String mensagem) {
		this.mensagem = mensagem;
	}

	public void setMensagemSaida(String mensagem) {
		this.mensagem = mensagem;
	}

	public boolean getEnviada() {
		return this.enviada;
	}

	public void setSessao(Sessao sessao) {
		this.sessao = sessao;
	}

	public String getSn() {
		return sn;
	}

	public void setSn(String sn) {
		this.sn = sn;
	}

}
